#ifndef __EPOLL_HPP__
#define __EPOLL_HPP__

#include <sys/epoll.h>
#include "log.hpp"

// 封装epoll相关的接口
namespace QiHai
{
    struct epoll
    {
        // 创建epoll模型，如果出错返回-1并且打出log
        static int create()
        {
            int epfd = epoll_create(256);  // size > 0 即可，本身已经是淘汰的参数
            if (epfd < 0) logMessage(FATAL, "epoll_create error %d:%s", errno, strerror(errno));
            return epfd;
        }

        // 操作对应epoll模型，EPOLL_CTL_ADD添加fd，EPOLL_CTL_MOD改fd，EPOLL_CTL_DEL删fd，关心什么事件：EPOLLIN读取、EPOLLOUT写入.....如果出错返回-1打出log
        static int ctl(int epfd, int op, int fd, int event = 0)  // 注意这里缺省参数是给删除的时候用的，反正此时也无需关心了
        {
            struct epoll_event ev;
            ev.events = event;
            ev.data.fd = fd;  // 联合体，等会想在就绪队列中取出对应fd的信息，所以这里存储fd相关信息

            int n = epoll_ctl(epfd, op, fd, &ev);  // 成功的时候返回0,否则返回-1
            if (n == -1) logMessage(FATAL, "epoll_ctl error %d:%s", errno, strerror(errno));
            return n;
        }

        // 取出对应epoll模型中就绪队列中的struct epoll_event->node 最大个数，并且设置ms时间是否阻塞还是非阻塞 0表示无就绪事件，大于0表示存在事件，返回到缓冲区中，从0到n按顺序放好的，-1表示出错了
        static int wait(int epfd, epoll_event* events, int maxsize, int timeout)
        {
            int n = epoll_wait(epfd, events, maxsize, timeout);
            return n;
        } 
    };
}

#endif